package org.dromara.system.service;

import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.bo.SysTenantBo;
import org.dromara.system.domain.vo.SysTenantVo;

import java.util.Collection;
import java.util.List;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：租户Service接口
 */
public interface ISysTenantService {

    /**
     * 查询租户
     *
     * @param id 租户ID
     * @return 返回SysTenantVo对象，包含租户信息
     */
    SysTenantVo queryById(Long id);

    /**
     * 基于租户ID查询租户
     *
     * @param tenantId 租户ID
     * @return 返回SysTenantVo对象，包含租户信息
     */
    SysTenantVo queryByTenantId(String tenantId);

    /**
     * 查询租户列表
     *
     * @param bo 查询条件对象，用于指定查询参数
     * @param pageQuery 分页查询对象，用于指定分页参数
     * @return 返回TableDataInfo对象，包含分页后的租户列表信息
     */
    TableDataInfo<SysTenantVo> queryPageList(SysTenantBo bo, PageQuery pageQuery);

    /**
     * 查询租户列表
     *
     * @param bo 查询条件对象，用于指定查询参数
     * @return 返回符合查询条件的租户列表
     */
    List<SysTenantVo> queryList(SysTenantBo bo);

    /**
     * 新增租户
     *
     * @param bo 包含租户信息的对象
     * @return 插入操作是否成功
     */
    Boolean insertByBo(SysTenantBo bo);

    /**
     * 修改租户
     *
     * @param bo 包含更新的租户信息的对象
     * @return 更新操作是否成功
     */
    Boolean updateByBo(SysTenantBo bo);

    /**
     * 修改租户状态
     *
     * @param bo 包含需要更新状态的租户信息的对象
     * @return 更新状态受影响的行数
     */
    int updateTenantStatus(SysTenantBo bo);

    /**
     * 校验租户是否允许操作
     *
     * @param tenantId 租户ID
     * @throws RuntimeException 如果租户不允许被操作，则抛出运行时异常
     */
    void checkTenantAllowed(String tenantId);

    /**
     * 校验并批量删除租户信息
     *
     * @param ids 租户ID的集合
     * @param isValid 校验标志，决定是否进行校验
     * @return 删除操作是否成功
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    /**
     * 校验企业名称是否唯一
     *
     * @param bo 包含企业名称等信息的对象
     * @return 企业名称是否唯一
     */
    boolean checkCompanyNameUnique(SysTenantBo bo);

    /**
     * 校验账号余额
     *
     * @param tenantId 租户ID
     * @return 余额是否充足
     */
    boolean checkAccountBalance(String tenantId);

    /**
     * 校验有效期
     *
     * @param tenantId 租户ID
     * @return 是否在有效期内
     */
    boolean checkExpireTime(String tenantId);

    /**
     * 同步租户套餐
     *
     * @param tenantId 租户ID
     * @param packageId 套餐ID
     * @return 同步操作是否成功
     */
    Boolean syncTenantPackage(String tenantId, Long packageId);
}
